Fix vertical cursor motion when there are overlay strings at EOL.
authorEli Zaretskii <eliz@gnu.org>
Sat, 13 Apr 2013 08:54:02 +0000 (11:54 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 13 Apr 2013 08:54:02 +0000 (11:54 +0300)
 src/indent.c (Fvertical_motion): Don't consider display strings on
 overlay strings as display strings on the buffer position we
 started from.  This prevents vertical cursor motion from jumping
 more than one line when there's an overlay string with a display
 property at end of line.
 Reported by Karl Chen <Karl.Chen@quarl.org> in
 http://lists.gnu.org/archive/html/emacs-devel/2013-04/msg00362.html.

src/ChangeLog
src/indent.c

index 0055ed3116275a29d5a9ebb91ea3c0205bc5f877..262baca588204696c690f0b020f40a0455e4eff9 100644 (file)
@@ -1,3 +1,13 @@
+2013-04-13  Eli Zaretskii  <eliz@gnu.org>
+
+       * indent.c (Fvertical_motion): Don't consider display strings on
+       overlay strings as display strings on the buffer position we
+       started from.  This prevents vertical cursor motion from jumping
+       more than one line when there's an overlay string with a display
+       property at end of line.
+       Reported by Karl Chen <Karl.Chen@quarl.org> in
+       http://lists.gnu.org/archive/html/emacs-devel/2013-04/msg00362.html.
+
 2013-04-12  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * window.c (select_window): `record_buffer' even if window is
index 67796ab8a8fc1ee800342ad6bc69fd49b82fe76d..47358e17db8174f2c087cbd78c24039ac229db1b 100644 (file)
@@ -2006,11 +2006,15 @@ whether or not it is currently displayed in some window.  */)
          const char *s = SSDATA (it.string);
          const char *e = s + SBYTES (it.string);
 
+         disp_string_at_start_p =
          /* If it.area is anything but TEXT_AREA, we need not bother
             about the display string, as it doesn't affect cursor
             positioning.  */
-         disp_string_at_start_p =
-           it.string_from_display_prop_p && it.area == TEXT_AREA;
+           it.area == TEXT_AREA
+           && it.string_from_display_prop_p
+           /* A display string on anything but buffer text (e.g., on
+              an overlay string) doesn't affect cursor positioning.  */
+           && (it.sp > 0 && it.stack[it.sp - 1].method == GET_FROM_BUFFER);
          while (s < e)
            {
              if (*s++ == '\n')